\documentclass[11pt,a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[top=3cm,bottom=2cm,left=2cm,right=2cm]{geometry}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{wrapfig}

\pagestyle{fancy}
\lhead{POO - TD4}
\rhead{\'Equipe Optiplex}
\lfoot{\bsc{Enseirb-Matmeca}}
\rfoot{Informatique - I2}
\renewcommand{\footrulewidth}{0.5px}

\begin{document}

\begin{center}
\huge{\textbf{POO - TD4 : Des nouveaux caractères d’usagers.}}
\end{center}

\begin{flushleft}
\emph{\'Equipe \og Optiplex \fg composée de : Yannick Levif, Joffrey Diebold, Mohamed Akdim, Jérôme Le Bot}
\end{flushleft}

\section{Programmer avec des abstractions}

\textit{Expliquer l’importance de cette relation de type/sous-type dans un langage typé.}\\
	La relation type/sous-type se construit dans le cadre de l'héritage. Elle permet d'attribuer des comportements a un ensemble d'objets et de définir une bonne fois pour toute les méthodes communes à aux objets appartenant a cet ensemble. Ceci permet d'éviter d'avoir du code redondant.
	
\subsection{Les interfaces Passager et Bus}

\textit{Pourquoi n’est-il pas nécessaire de déclarer la méthode toString() dans ces interfaces ?}\newline
	Il n'est pas nécéssaire de déclarer la methode toString() dans ces interfaces car ce sont des classes non instanciables. Elles ne contiennent que des methodes abstraites.
	De plus, il peut y avoir plusieurs classes qui implémentent l'interface, disposant de leur propre fonction ToString.
	
\subsection{Remaniement des tests unitaires} 

L'ajout des interfaces Passager et Bus nous permet de déduire le diagramme de classe suivant :

\begin{center}
\includegraphics[scale=0.53]{Diagramme classe 2.JPG} 
\end{center}	


\section{Portée et dépendance de compilation}
\subsection{Séparer les méthodes avec des portées différentes}

\textit{Une autre solution est de remplacer l’interface par une construction classe abstraite et de déclarer les bonnes portées. Pourquoi cette solution n’est pas satisfaisante en terme de dépendance ?} \\
	Cette solution n'est pas satisfaisante en terme de dépendances car cela implique le fait que chaque classe utilisant les méthodes génériques définies dans la classe abstraite vont devoir contenir un lien a-un avec cette classe.\\
	De plus, il faudra modifier les classes existantes pour qu'elles implémentent une nouvelle classe abstraite. 
	
\subsection{Remaniement}
Il est nécessaire d'effectuer la conversion dans le code de la méthode monterDans car l'interface Transport ne contient pas toutes les méthodes que l'on veut tester dans monterDans (par exemple aPlacesAssises) qui ne sont justement pas accessibles au client, car elles appartiennent à l'interface Bus interne au paquetage.  \\ 
	
Nous avons rencontré une erreur au niveau de la compilation après création des nouvelles interfaces Transport et Usager, la méthode monterDans n'était plus reconnue dans l'interface Passager car le transtypage à induit que le compilateur considère la classe PassagerStandard comme une classe abstraite.\\
Nous avons du retirer la méthode monterDans de l'interface, ainsi dans le code de TestPassagerStandard, il est nécessaire d'utiliser des instances de Usager pour que cette méthode soit reconnue.

\medskip
Le client peut encore utiliser les méthodes des interfaces internes au paquetage uniquement si elles sont définies aussi dans les interfaces Usager et Transport qui sont les interfaces publiques.\\ 




\section{Les classes concrètes}

\textbf{1ère solution: Classes concrètes publiques.}\\

\noindent Dans cette solution, le client instancie ces classes concrètes (Bus et PassagerStandard). \\
Les interfaces Bus et Passager sont remplacées par des classes abstraites Bus et Passager. \\
Ces classes abstraites contiennent uniquement la déclaration de méthodes abstraites avec comme portée le paquetage. \\
Les classes Autobus et PassagerStandard auront désormais un lien "est-un" avec ces classes abstraites et les interfaces Transport ou Usager. \\
\linebreak 
Par exemple, la classe Autobus sera déclarée : 
\begin{verbatim}
public class Autobus extends Bus implements Transport {...} 
\end{verbatim}
\bigskip 

\textbf{2ème solution: Classes concrètes non publiques.}\\

\noindent Dans ce cas, le client ne peut plus instancier ces classes qui sont inaccessible en dehors du paquetage. \\
Les méthodes internes restent avec une portée publique et nous gardons la construction interface pour Passager ou Bus. \\ 
Le service d’instanciation est fourni par la classe publique tec.FabriqueTec qui contient uniquement des méthodes de classes fairePassagerStandard() et faireAutobus(). \\
Chacune de ces méthodes effectue l’instanciation de la classe concrète interne au paquetage. \\
\linebreak
Les prototypes de ces deux méthodes peuvent s'écrire de la façon suivante :

	\begin{verbatim}
public static final Autobus faireAutobus(int nb_assis, int nb_debout);	

	public static final PassagerStandard fairePassagerStandard(String nom, int dest);
\end{verbatim}
\bigskip

\subsection{Comparer ces deux solutions}

L'application de la première méthode nous donne le diagramme de classe suivant : 

\includegraphics[scale=0.64]{diag_abstract.JPG} 
\medskip

L'application de la seconde méthode nous donne le diagramme de classe suivant : 

\includegraphics[scale=0.64]{diag_FabriqueTec.JPG} 

\bigskip
Ces deux méthodes serviront au client pour faire les instanciations nécessaires, notamment dans la classe Simple qui va hériter la classe FabriqueTec.\\
Par exemple, l'utilisation d'un Transport passe par la méthode faireAutobus() pour effectuer l'instanciation:\begin{verbatim}
Transport serenity = faireAutobus(1, 2);
\end{verbatim}

Cependant la classe tec.FabriqueTec ne doit ni être instanciée, ni servir de classe de base. \\ 
Pour cela elle est définie en tant que classe abstraite, et les méthodes qu'elle contient sont déclarées en "final" pour ne pas être modifiées. \\


\bigskip
\bigskip

\noindent \textsl{Nous n'avons pas pu effectuer le travail demandé dans la partie 4 (utilisant l'introspection) par manque de temps.
Néanmoins, cette tâche sera accomplie et commentée dans le prochain compte rendu.}
 

\end{document}
